import { fileURLToPath, URL } from 'node:url'

import { defineConfig, loadEnv } from 'vite'
import vue from '@vitejs/plugin-vue'

import { createHtmlPlugin } from 'vite-plugin-html'

import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'

const getTarget = (mode: string, target: string) => {
  return loadEnv(mode, process.cwd())[target]
}

// https://vitejs.dev/config/
export default defineConfig(({ mode }) => {
  const ENV = loadEnv(mode, process.cwd())
  return {
    plugins: [
      vue(),
      AutoImport({
        include: [/\.[tj]sx?$/, /\.vue$/, /\.vue\?vue/, /\.md$/],
        imports: ['vue', 'vue-router', 'pinia'],
        resolvers: [],
        dirs: ['./src/composables', './src/utils', './src/api', './src/stores'],
        vueTemplate: true,
        dts: './src/auto-imports.d.ts'
      }),
      Components({
        dirs: ['./src/components'],
        dts: './src/components.d.ts'
      }),
      createHtmlPlugin({
        inject: { data: { title: getTarget(mode, 'VITE_APP_TITLE') } }
      })
    ],
    resolve: {
      alias: [{ find: '@', replacement: fileURLToPath(new URL('./src', import.meta.url)) }]
    },
    base: ENV.VITE_APP_BASE_PUBLIC,
    build: {
      target: 'modules',
      // 指定输出文件
      outDir: 'dist',
      // 用于放置生成的静态资源 (js、css、img、fonts) 的；（项目打包之后，静态资源会放在这个文件夹下）
      assetsDir: 'static',
      // 混淆器 terser 构建后文件体积更小
      minify: 'terser',
      // 启用/禁用 CSS 代码拆分。当启用时，在异步 chunk 中导入的 CSS 将内联到异步 chunk 本身，并在块加载时插入。
      // 如果禁用，整个项目中的所有 CSS 将被提取到一个 CSS 文件中
      cssCodeSplit: true,
      // 默认为false;构建后是否生成source map文件
      sourcemap: false,
      terserOptions: {
        compress: {
          // 生产环境移除console
          drop_console: true,
          // 生产环境移除debugger
          drop_debugger: true
        }
      }
    },
    server: {
      // 配置是否关闭本地域名访问
      // 指定服务器应该监听哪个 IP 地址。 如果将此设置为 0.0.0.0 或者 true 将监听所有地址，包括局域网和公网地址。
      host: true,
      // 端口号 默认 3000
      // port: 3000,
      // 配合port,如果端口被占用 设置为true，就会自动退出不会尝试寻找下一个出口
      strictPort: false,
      // 默认启用并允许任何源
      cors: true,
      // 在服务器启动时自动在浏览器中打开应用程序
      open: false,
      //https.createServer()配置项 是否强制HTTPS
      // https: false,
      proxy: {
        [ENV.VITE_APP_BASE_API]: {
          target: ENV.VITE_APP_BASE_URL,
          changeOrigin: true,
          secure: false,
          ws: true,
          rewrite: (path) => path.replace(new RegExp(`${ENV.VITE_APP_BASE_API}`, 'g'), '')
        }
      }
    }
  }
})
